package mua.core.value;

import mua.core.interpreter.Parse;
import mua.core.operation.MuaOperation;

import java.util.Scanner;
import java.util.Stack;

import static mua.core.interpreter.Util.isOneSentence;
import static mua.core.interpreter.Util.split;

public class Execution extends FunctionBody {
    public Execution(FunctionBody functionBody) {
        super("["+functionBody.getArguments()+functionBody.getExpression()+"]", functionBody);
    }

    /**
     * 运行一个函数体的内容
     * @param scanner scanner
     * @return 返回函数执行结果
     */
    public MuaValue run(Scanner scanner){
        //先将"[]"内所有内容提取出来
        String s =expression;
        String ops = s.substring(1,s.length()-1);
        //记录所有操作，直到所有操作结束，一条命令结束
        Stack<String> operations = new Stack<>();
        //记录value的个数
        int values = 0;
        //一句话
        StringBuilder one = new StringBuilder();
        String[] parts = split(ops);
        while(parts[0]!=null&&!parts[0].isEmpty()){
            one.append(parts[0]).append(" ");
            //判断为操作符或操作数
            //根据p3要求，如果本地无直接判断全局（函数中已判断）
            if(MuaOperation.contains(parts[0], this)){
                operations.push(parts[0]);
            }else{
                values++;
            }
            //尝试是否为一句话
            if(isOneSentence(operations, values, this)){
                //如果是一句话则，判断是否为最后一部分
                MuaValue muaValue = Parse.parseLine(one.toString(), scanner, this);
                //如果为最后一部分，则返回
                if(parts[1]==null) return muaValue;
                else if(parts[1].isEmpty())return muaValue;
                //不为最后一部分则清空values，one，和栈
                operations.clear();
                values=0;
                one = new StringBuilder();
            }
            parts = split(parts[1]);
        }
        return new MuaValue();
    }
}
